'''
Created on Mar 29, 2011

@author: diego
'''

from globals import *
from fileUtils import *
from threading import Thread
import time



def printTablero(tablero):
    print("\n")
    for i in range(filas):
        print tablero[i]
    print("\n")
    
def printTableroHTML(tablero, file = "output.html", root = False, sleepTime = 1):
    if not config.print_html_activated:
        return
    time.sleep(sleepTime)
    data = "<html><head><meta http-equiv=\"refresh\" content=\"0\" ></head><table><tr><td>     <table align=\"left\" border=\"8\" ><tr><td></td><td>0</td><td>1</td><td>2</td><td>3</td><td>4</td></tr>" 
    for i in range(filas):
        data += "<tr><td>"+str(i)+"</td>"
        for j in range(filas):
            if tablero[i][j] == NEGRAS:
                data += "<td><img src=\"img/NEGRAS.png\"/></td>"
                continue
            if tablero[i][j] == BLANCAS:
                data += "<td><img src=\"img/BLANCAS.png\"/></td>"
                continue
            else:                        
                data += "<td><img src=\"img/blank.png\"/></td>"
        data += "</tr>"        
    data +="</table></td>"  
    if root:
        data += "<td><iframe align=\"right\" width=\"600px\" height=\"600px\" src=\"minimax.html\" frameborder=\"0\" ></td>"  
    data += "</tr></table></html>"
    writeToOutput(data,file)
    
class _Move():        
    def __init__(self,tupleOrigen,tupleDestino):
        self.origen = tupleOrigen
        self.destino = tupleDestino
    def __str__(self):
        return 'Origen: ' +str(self.origen[0])+ '-' + str(self.origen[1])+' destino: '+str(self.destino[0])+'-'+str(self.destino[1])
    def __repr__(self):
        return 'Origen: ' +str(self.origen[0])+ '-' + str(self.origen[1])+' destino: '+str(self.destino[0])+'-'+str(self.destino[1])
def iniciarTablero():
    tablero = []
    for i in range(filas):
        fila = []
        for j in range(filas):
            fila.append(0)
        tablero.append(fila)
    for i in range(filas):
        tablero[0][i] = NEGRAS    
        tablero[4][i] = BLANCAS
    tablero[1][0] = NEGRAS
    tablero[1][4] = NEGRAS
    tablero[3][0] = BLANCAS
    tablero[3][4] = BLANCAS
    return tablero
    
def esJugador(fila, columna,jugador, tablero):
    return tablero[fila][columna]==jugador

def estaEnPosicionFinal(fila, columna, jugador, tablero):
    listaPosiciones = []
    tupla = (fila,columna)
    if (jugador == NEGRAS):
        listaPosiciones = posicionesBlancas
    elif(jugador == BLANCAS):
        listaPosiciones = posicionesNegras
    else:
        return False     
       
    for casillero in listaPosiciones:
        if casillero == tupla:
            return True
    

def obtenerPosicionesOponente(jugador):
    if jugador == NEGRAS:
        return posicionesBlancas
    else:
        return posicionesNegras
    
def lugarDisponible(fila, columna, tablero):
    return tablero[fila][columna] == 0

def lugarDisponibleTupla(tupla, tablero):
    return tablero[tupla[0]][tupla[1]] == 0

def obtenerFichasJugador(jugador, tablero):
    listaFichas = []
    for i in range(filas):
        for j in range(filas):
            if tablero[i][j] == jugador:
                listaFichas.append((i,j))
    return listaFichas
    

#Verifica si el jugador (NEGRAS o BLANCAS) gano
def verificarGano(jugador, tablero):
    result = True
    for pos in obtenerPosicionesOponente(jugador):
        result = result and esJugador(pos[0],pos[1],jugador, tablero)
    return result
        

def obtenerOponente(jugador):
    if jugador == NEGRAS:
        return BLANCAS
    return NEGRAS
            
        
#Funcion que retorna una lista con tuplas que indican los posibles movimientos a hacer        
def obtenerPosiblesMovimientosFicha(fila, columna, tablero):
    results = []
    if not lugarDisponible(fila, columna, tablero):
        arribaIzquierda = (fila -1, columna -1)
        arribaDerecha = (fila-1,columna+1)
        abajoIzquierda = (fila +1,columna -1)
        abajoDerecha = (fila +1,columna +1)

        if arribaIzquierda[0] >= 0 and arribaIzquierda[1] >= 0 and arribaIzquierda[0]<5 and arribaIzquierda[1]<5 and lugarDisponibleTupla(arribaIzquierda, tablero):
            results.append(arribaIzquierda)
            
        if arribaDerecha[0] >= 0 and arribaDerecha[1] >= 0 and arribaDerecha[0]<5 and arribaDerecha[1]<5 and lugarDisponibleTupla(arribaDerecha, tablero):
            results.append(arribaDerecha)
            
        if abajoDerecha[0] >= 0 and abajoDerecha[1] >= 0 and abajoDerecha[0] < 5 and abajoDerecha[1] < 5 and lugarDisponibleTupla(abajoDerecha, tablero):
            results.append(abajoDerecha)
            
        if abajoIzquierda[0] >= 0 and abajoIzquierda[1] >= 0 and  abajoIzquierda[0] < 5 and abajoIzquierda[1] < 5 and lugarDisponibleTupla(abajoIzquierda, tablero):
            results.append(abajoIzquierda)
            
    return results

def obtenerPosiblesMovimientosJugador(jugador, tablero):
    results = []
    for ficha in obtenerFichasJugador(jugador, tablero):
        for destino in (obtenerPosiblesMovimientosFicha(ficha[0], ficha[1], tablero)):
            results.append(_Move(ficha, destino))
    return results    
        
        
def testGlobalBoard():
    printTablero(global_board)
    
    
def hacerMovimiento(tablero, move, jugador):
    nuevoTablero = []
    for i in range(filas):
        fila = []
        for j in range(filas):
            fila.append(tablero[i][j])
        nuevoTablero.append(fila)
    nuevoTablero[move.origen[0]][move.origen[1]]=0
    nuevoTablero[move.destino[0]][move.destino[1]]=jugador       
    return nuevoTablero
    
    

        

#def movimientosToMoves(listaTuplas):
#    movesARetornar = []
#    for tupla in listaTuplas:
#        movesARetornar.append(_Move(tupla))
#    return movesARetornar


        

            
    
    

